#ifndef PARTIDA_H_
#define PARTIDA_H_
#include <jsoncpp/json.h>
#include <iostream>
#include <map>
#include <string>
#include "Socket.h"
#include "Mutex.h"
#include "PanelJuego.h"
#include "DesplazadorFichas.h"
#include "Usuario.h"
#define NO_SELECCIONADO -1

class Partida {
    void vaciar();
    void cargarJugadores(Json::Value);

    void cargarDatosNivel(Json::Value);

    void cargarFichas(Json::Value);
    void actualizarTablero(Json::Value mov, Json::Value& tableros);

    void solicitarMovimiento();

    Socket *cliente;

    int idPartida;
    std::map<std::string, Usuario *> jugadores;
    PanelJuego *panelJuego;
    

    int nroFilas, nroCols;

    int x1, y1, x2, y2;
    std::string clave;

    Mutex *m_protectoFichas;

    Json::Value mov;

  private:
    DesplazadorFichas *animacion_valida, *animacion_invalida;
    static Mutex m_animando, m_status;
    static bool animando;
    static Gtk::Statusbar* statusBar;

  public:
    explicit Partida(int idPartida, Json::Value vecJug, Json::Value datosNivel,
                     Json::Value vecFichas, PanelJuego *panelJuego,
                      int nroFilas, int nroCols, std::string pathImagenFondo, 
                      Gtk::Statusbar* status);
    virtual ~Partida();

    void seleccionarFicha(int x, int y);

    void establecerComunicador(Socket * socket);

    void establecerClave(std::string clave);

    int obtenerPuntajeUsuario();

    void eliminarContenido();

    void notificarRetiro();

    void actualizarPartida(Json::Value mov, Json::Value jugadores,
                                            Json::Value* tableros);
    void actualizarPuntajes(Json::Value);
    void animarMovInvalido(Json::Value mov_inv);

    static void setAnimando(bool estado);
    static bool estaAnimando();

    static void mostrarMensaje(std::string mensaje);

};
#endif
